package com.cskaoyan._07constructor._02basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/4 10:53
 **/
/*
构造方法(构造器)
    语法:
        [访问权限修饰符] 类名(形参列表){
            // 构造方法体
        }
    说明:
        1.权限修饰符--->先写成public
        2.没有static
        3.没有方法返回值类型
        4.方法名跟类名一模一样
        5.形参列表跟之前说的方法一样
        6.构造方法体跟之前的方法一样,可以写一些代码,构造方法体内定义的变量还是局部变量
        7.形参列表可以为空--->无参默认构造方法, 如果非空--->有参构造方法
        8.构造方法可以重载的

     构造方法使用:
        给成员变量赋值
        使用: new 类名(实参列表)
        1. new关键字去创建对象的时候，JVM自动去调用构造方法，
        构造方法无法通过普通方法的调用方式调用。
        2. 构造器的作用不是创建对象，创建对象是JVM的事情。
        构造器只是告诉JVM在创建对象过程中，给成员变量赋什么值。


注意:
    1.类中如果没有写任何构造方法,会存在一个默认的无参的构造方法
    2.类中如果已经有了其他构造方法,默认隐藏的无参的构造方法就不存在了(可以显式的写出来)
        构造方法快速生成 alt+insert--->Constructor
 */
public class Demo {
    public static void main(String[] args) {
        // 创建Student对象,会自动调用构造方法(根据参数列表)
        Student s1 = new Student("张三", 20);
        System.out.println(s1.name);
        System.out.println(s1.age);

        System.out.println("------------");
        Student s2 = new Student("李四");
        System.out.println(s2.name);
        System.out.println(s2.age);

        System.out.println("--------");
        Car car = new Car();
        System.out.println(car);
    }
}

class Student{
    String name;
    int age;
    // 构造方法
    //public Student(String sName,int sAge){
    //    // 给成员变量赋值
    //    //name = sName;
    //    //age = sAge;
    //    this.name = sName;
    //    this.age = sAge;
    //}

    // 可以使用快捷键 alt+insert

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String name) {
        System.out.println("单参的构造方法执行了");
        this.name = name;
    }
}


class Car{
    String color;
    // 没有写构造方法
    // 隐藏一个默认的无参构造方法


    // 定义了一个单参的构造方法
    public Car(String color) {
        this.color = color;
    }

    // 把隐藏的默认的无参构造方法显式写出来
    public Car() {
        System.out.println("Car 无参构造方法执行了 !");
    }
}